#include<iostream>
#include<future>
#include<thread>
#include<memory>


//std::future本质上不是一个异步任务，而是一个辅助我们获取异步任务结果的东西
//std::future并不能单独使用，需要搭配一些能够执行异步任务的模版类或函数一起使用
//异步任务搭配使用
//      std::async函数模版：异步执行一个函数，返回一个future对象用于获取函数结果
//      std::packaged_task类模版：为一个函数生成一个异步任务结果(可调用对象)，用于在其他线程中执行
//      std::promise类模版：实例化的对象可以返回一个future，在其他线程中相promise对象设置数据，其他线程的关联future就可以获取数据

//std::async是一个模版函数，内部会创建线程执行异步操作
//std::packaged_task是一个模版类，是一个任务包，是对一个函数进行二次封装，封装乘一个课调用对象作为任务放到其他线程执行的
//任务包封装好了以后，可以在任意位置进行调用，通过关联的future来获取执行结果

int Add(int num1,int num2)
{
    std::cout << "into add!\n";
    return num1+num2;
}

int main()
{
    //1.在使用的时候，先实例化一个指定结果的promise对象
    std::promise<int> pro;

    //2. 通过promise对象获取关联future对象
    std::future<int> res = pro.get_future();
    //3. 在任意位置给promise设置数据，就可以通过关联的future获取到这个设置的数据了
    std::thread thr([&pro](){
        int sum = Add(11,22);
        pro.set_value(sum);
    });

    std::cout << res.get() << std::endl;
    thr.join();

    return 0;
}